//******************************************************************
//******************************************************************
//**********          ANts Peer To Peer Sources        *************
//
// ANts P2P realizes a third generation P2P net. It protects your
// privacy while you are connected and makes you not trackable, hiding
// your identity (ip) and crypting everything you are sending/receiving
// from others.

// Copyright (C) 2004  Roberto Rossi

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

package ants.p2p.gui;

import java.awt.*;
import java.util.*;
import java.net.*;
import com.borland.jbcl.layout.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.*;
import java.beans.*;

import ants.p2p.irc.*;

import org.jibble.pircbot.*;
import org.apache.log4j.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class ChatAntPanel extends JPanel {
  public static String pic = "backgrounds/bg1.jpg";
  static Logger _logger = Logger.getLogger(ChatAntPanel.class.getName());

  XYLayout xYLayout1 = new XYLayout();
  JList jList1 = new JList();
  JLabel jLabel1 = new JLabel();
  JScrollPane jScrollPane1 = new JScrollPane();
  JTextPane jTextPane1 = new JTextPane();
  JTextField jTextField1 = new JTextField();
  IrcBot bot;
  JScrollPane jScrollPane2 = new JScrollPane();
  Image buffer;
  JLabel jLabel4 = new JLabel();
  JButton jButton1 = new JButton();
  JButton jButton2 = new JButton();
  JTextField jTextField3 = new JTextField();
  JLabel jLabel5 = new JLabel();

  ArrayList currentBanlist = new ArrayList();

  boolean keepCurrentViewport = false;
  JViewport vp = null;
  JTextField jTextField4 = new JTextField();
  JScrollPane jScrollPane3 = new JScrollPane();
  JList jList2 = new JList();

  ArrayList pendingDiscussions = new ArrayList();
  Border border1;
  JPanel jPanel1 = new JPanel();
  XYLayout xYLayout2 = new XYLayout();
  JLabel jLabel2 = new JLabel();
  JButton jButton4 = new JButton();
  JScrollPane jScrollPane4 = new JScrollPane();
  JList jList3 = new JList();
  Border border2;

  public ChatAntPanel(IrcBot bot) {
    this.bot = bot;
    try{
      Toolkit tk = Toolkit.getDefaultToolkit();
      MediaTracker mt = new MediaTracker(this);
      buffer = tk.getImage(this.getClass().getClassLoader().getResource(pic));
      mt.waitForAll();
    }catch(Exception e){}
    try {
      jbInit();
    }
    catch(Exception ex) {
      _logger.error("",ex);
    }
  }
  void jbInit() throws Exception {
    border1 = BorderFactory.createEmptyBorder(20,20,20,20);
    this.setBorder(border1);
    this.setDebugGraphicsOptions(0);
    this.addComponentListener(new ChatAntPanel_this_componentAdapter(this));
    this.setLayout(xYLayout1);
    jLabel1.setText(ji.JI.i("Users"));
    xYLayout1.setWidth(764);
    xYLayout1.setHeight(489);
    jTextField1.setOpaque(true);
    jTextField1.setToolTipText(ji.JI.i("Enter your message here"));
    jTextField1.setDocument(new StyledDiscussion());
    jTextField1.addKeyListener(new ChatAntPanel_jTextField1_keyAdapter(this));
    jTextPane1.setEditable(false);
    jTextPane1.setMargin(new Insets(5, 5, 30, 40));
    jTextPane1.addMouseListener(new ChatAntPanel_jTextPane1_mouseAdapter(this));
    jTextPane1.setAutoscrolls(true);
    jTextPane1.setBorder(null);
    jTextPane1.setOpaque(true);
    jTextPane1.setToolTipText(ji.JI.i("<HTML><BODY>This is a COMMON and NOT ANONYOMUS IRC CHANNEL.<BR>"+
                            "This channel is NOT related to the ANts network in any way!<BR>"+
                            "Userbase in this chatroom is not the current ANts network userbase,<BR>"+
                            "people you can see here are simply IRC users.</BODY></HTML>"));
    jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    jScrollPane1.setAutoscrolls(true);
    jScrollPane1.setOpaque(true);
    jLabel4.setText(ji.JI.i("Current channels"));
    jButton1.setToolTipText(ji.JI.i("Leave the selected discussion"));
    jButton1.setText(ji.JI.i("Leave"));
    jButton1.addActionListener(new ChatAntPanel_jButton1_actionAdapter(this));
    jButton2.setToolTipText(ji.JI.i("Request the OP status to the selected user using the given password"));
    jButton2.setText(ji.JI.i("Request Op"));
    jButton2.addActionListener(new ChatAntPanel_jButton2_actionAdapter(this));
    jTextField3.setMaximumSize(new Dimension(127, 2147483647));
    jTextField3.setMinimumSize(new Dimension(127, 21));
    jTextField3.setPreferredSize(new Dimension(127, 21));
    jTextField3.setToolTipText(ji.JI.i("Password for requestiong the OP status to the selectd user"));
    jTextField3.setText("");
    jLabel5.setText(ji.JI.i("Password for Op"));
    jTextField4.addFocusListener(new ChatAntPanel_jTextField4_focusAdapter(this));
    jList1.setOpaque(true);
    jList1.setToolTipText(ji.JI.i("Users in the active channel, right click for options"));
    jList1.addMouseListener(new ChatAntPanel_jList1_mouseAdapter(this));
    jTextField4.setOpaque(true);
    jTextField4.setToolTipText(ji.JI.i("Channel topic, you can change it only if the channel have no OP at " +
    "the moment or you are an OP"));
    jTextField4.setText("");
    jTextField4.addKeyListener(new ChatAntPanel_jTextField4_keyAdapter(this));
    jList2.addMouseListener(new ChatAntPanel_jList2_mouseAdapter(this));
    jList2.setToolTipText(ji.JI.i("Active channel and private discussions"));
    jList2.setVerifyInputWhenFocusTarget(true);
    jList2.setCellRenderer(new MyUserCellRenderer(this));
    jList2.setSelectionForeground(Color.white);
    jList2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jPanel1.setLayout(xYLayout2);
    jPanel1.setMinimumSize(new Dimension(500, 130));
    jPanel1.setOpaque(false);
    jPanel1.setPreferredSize(new Dimension(500, 130));
    jButton4.setToolTipText(ji.JI.i("Toggle the ban for the selected address"));
    jButton4.setText(ji.JI.i("Unban"));
    jButton4.addActionListener(new ChatAntPanel_jButton4_actionAdapter(this));
    jLabel2.setText(ji.JI.i("Channel banlist"));
    jScrollPane4.setMinimumSize(new Dimension(23, 23));
    jList3.setToolTipText(ji.JI.i("These are the banned addresses"));
    this.setToolTipText(ji.JI.i("<HTML><BODY>This is a COMMON and NOT ANONYOMUS IRC CHANNEL.<BR>"+
                            "This channel is NOT related to the ANts network in any way!<BR>"+
                            "Userbase in this chatroom is not the current ANts network userbase,<BR>"+
                            "people you can see here are simply IRC users.</BODY></HTML>"));
    this.add(jLabel1,   new XYConstraints(11, 18, -1, -1));
    this.add(jScrollPane1,           new XYConstraints(148, 35, 388, 223));
    jScrollPane1.getViewport().add(jTextPane1, null);
    this.add(jTextField1,   new XYConstraints(148, 263, 388, -1));
    this.add(jScrollPane2,      new XYConstraints(9, 35, 127, 248));
    this.add(jTextField4,   new XYConstraints(148, 11, 388, -1));
    this.add(jScrollPane3,    new XYConstraints(541, 36, 118, 224));
    this.add(jLabel4,  new XYConstraints(545, 18, -1, -1));
    this.add(jButton1, new XYConstraints(541, 263, -1, -1));
    this.add(jPanel1,                           new XYConstraints(0, 310, 717, 140));
    jPanel1.add(jButton2,    new XYConstraints(0, 0, -1, -1));
    jPanel1.add(jTextField3,    new XYConstraints(0, 50, -1, -1));
    jPanel1.add(jLabel5,   new XYConstraints(0, 30, -1, -1));
    jPanel1.add(jScrollPane4,               new XYConstraints(148, 15, 400, 120));
    jPanel1.add(jLabel2,  new XYConstraints(148, 0, -1, -1));
    jPanel1.add(jButton4,    new XYConstraints(0, 112, -1, -1));
    jScrollPane4.getViewport().add(jList3, null);
    jScrollPane3.getViewport().add(jList2, null);
    jScrollPane2.getViewport().add(jList1, null);
  }

  public JTextPane getJTextPanel(){
    return this.jTextPane1;
  }

  public String getCurrentSelectedDiscussion(){
    return (String)this.jList2.getSelectedValue();
  }

  public JList getUserList(){
    return this.jList1;
  }

  public void setUserList(User[] users) {
    if(users != null){
      this.jList1.setListData(users);
    }
  }

  public void setTopic(String topic){
    this.jTextField4.setText(topic);
  }

  public void setChannel(String channel){
    for(int x = 0; x < this.bot.getDiscussions().length; x++){
      if (this.bot.getDiscussions()[x].equals(channel)) {
        this.jList2.setSelectedIndex(x);
        return;
      }
    }
    this.pendingDiscussions.remove(channel);
    this.jList2.revalidate();
  }

  public void checkOp(){
    try{
      if (this.getUserList().getNextMatch("@" + this.bot.getNick(), 0, Position.Bias.Forward) != -1 ||
          this.getUserList().getNextMatch("@", 0, Position.Bias.Forward) == -1 ){
        this.jTextField4.setEditable(true);
        this.jButton4.setVisible(true);
      }
      else{
        this.jTextField4.setEditable(false);
        this.jButton4.setVisible(false);
      }
    }
    catch (Exception e) {}
  }

  public void addDiscussion(String key){
    this.jList2.setListData(this.bot.getDiscussions());
    this.jList2.revalidate();
  }

  public void setMessage(String key, String user, String message){
    String selected = (String)this.jList2.getSelectedValue();
    this.bot.setMessage(key, message, user);
    this.jList2.setListData(this.bot.getDiscussions());
    this.jList2.setSelectedValue(selected,true);
    if(this.jList2.getSelectedValue().equals(key)){
      this.jTextPane1.setDocument(this.bot.getDiscussion(key));
      if(!this.keepCurrentViewport)
        this.jTextPane1.scrollRectToVisible(new Rectangle(new Point(0,this.jTextPane1.getHeight()-this.jScrollPane1.getHeight()+50),new Dimension(this.jScrollPane1.getWidth(),this.jScrollPane2.getHeight())));
      else
        this.jTextPane1.scrollRectToVisible(new Rectangle(this.vp.getLocation(), this.vp.getSize()));
      this.repaint();
    }else{
      if(!this.pendingDiscussions.contains(key))
        this.pendingDiscussions.add(key);
      this.repaint();
    }
  }

  public void setControlMessage(String key, String message){
    this.bot.setControlMessage(key, message);
    if(this.jList2.getSelectedValue().equals(key)){
      this.jTextPane1.setDocument(this.bot.getDiscussion(key));
      if(!this.keepCurrentViewport)
        this.jTextPane1.scrollRectToVisible(new Rectangle(new Point(0,this.jTextPane1.getHeight()-this.jScrollPane1.getHeight()),new Dimension(this.jScrollPane1.getWidth(),this.jScrollPane2.getHeight())));
      else
        this.jTextPane1.scrollRectToVisible(new Rectangle(this.vp.getLocation(), this.vp.getSize()));
    }else{
      if(!this.pendingDiscussions.contains(key))
        this.pendingDiscussions.add(key);
      this.repaint();
    }
  }

  String getFirstParameter(String input){
    input = input.trim();
    if(input.indexOf(' ') > 0)
      input = input.substring(0,input.indexOf(' '));
    return input;
  }

  void jTextField1_keyPressed(KeyEvent e) {
    if (e.getKeyChar() == '\n') {
      if (this.jTextField1.getText().startsWith("/") && this.jTextField1.getText().length() > 1){
        this.bot.sendRawLine(this.jTextField1.getText().substring(1));
        this.jTextField1.setText("");
      }
      /*if(this.jTextField1.getText().startsWith("/list")){
        this.bot.listChannels(">10");
        this.jTextField1.setText("");
           }else if(this.jTextField1.getText().startsWith("/nick ")){
        String nick = this.jTextField1.getText().substring(6);
        nick = this.getFirstParameter(nick);
        if(nick != null & nick.length() > 0){
          this.bot.changeNick(nick);
        }
        this.jTextField1.setText("");
           }else if(this.jTextField1.getText().startsWith("/me ")){
        String action = this.jTextField1.getText().substring(4);
        if(action != null & action.length() > 0){
          if(((String)this.getCurrentSelectedDiscussion()).charAt(0)=='#'){
            this.bot.sendAction( (String)this.getCurrentSelectedDiscussion(),
                                action);
       this.setControlMessage( (String)this.getCurrentSelectedDiscussion(),
                                   "* " + this.bot.getNick() + " "+action);
          }
        }
        this.jTextField1.setText("");
           }else if(this.jTextField1.getText().startsWith("/join ")){
        String channel = this.jTextField1.getText().substring(6);
        channel = this.getFirstParameter(channel);
        if(channel.charAt(0)=='#' &&
           channel.length() > 1){
          if (Arrays.binarySearch(this.bot.getChannels(), channel) < 0) {
            this.bot.joinChannel(channel);
            try {
              Thread.sleep(3000);
            }
            catch (Exception ex) {}
            this.refreshCurrentChannel();
            this.refreshBanList();
          }
          else {
            this.setChannel(channel);
            this.refreshCurrentChannel();
            this.refreshBanList();
          }
          this.jTextField1.setText("");
        }
           }*/
      else if ( ( (String)this.getCurrentSelectedDiscussion()).equals(IrcBot.
          connectionStateChannel)) {
        return;
      }
      else if ( ( (String)this.getCurrentSelectedDiscussion()).charAt(0) == '#') {
        this.bot.sendMessage(this.getCurrentSelectedDiscussion(),
                             this.jTextField1.getText());
        this.setMessage(this.getCurrentSelectedDiscussion(), bot.getNick(),
                        this.jTextField1.getText());
        this.jTextField1.setText("");
      }
      else {
        this.bot.sendMessage( (String)this.getCurrentSelectedDiscussion(),
                             this.jTextField1.getText());
        this.setMessage( (String)this.getCurrentSelectedDiscussion(),
                        bot.getNick(), this.jTextField1.getText());
        this.jTextField1.setText("");
      }
    }
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (buffer != null){
      int posX = (this.getWidth() - 650)/2;
      int posY = (this.getHeight() - 550)/2;
      if(posX < 0) posX = 0;
      if(posY < 0) posY = 0;
      g.drawImage(buffer, posX, posY, this);
    }
  }

  void jButton1_actionPerformed(ActionEvent e) {
    this.leaveDiscussion((String)this.jList2.getSelectedValue());
  }

  public void leaveDiscussion(String discussion){
    if(!discussion.equals(ConnectionAntPanel.ircChannel) &&
       discussion.charAt(0)=='#'){
      this.bot.partChannel(discussion);
      this.bot.removeDiscussion(discussion);
      this.jList2.setListData(this.bot.getDiscussions());
      this.jList2.setSelectedValue(ConnectionAntPanel.ircChannel,true);
      this.refreshCurrentChannel();
      this.refreshBanList();
    }else if(!(discussion.charAt(0)=='#')){
      this.bot.removeDiscussion(discussion);
      this.jList2.setListData(this.bot.getDiscussions());
      this.jList2.setSelectedValue(ConnectionAntPanel.ircChannel,true);
      this.refreshCurrentChannel();
      this.refreshBanList();
    }
  }

  void jButton3_actionPerformed(ActionEvent e) {
    if ( ( (String)this.getCurrentSelectedDiscussion()).charAt(0) == '#') {
      if (this.jList1.getSelectedValues().length > 0) {
        for (int x = 0; x < this.jList1.getSelectedValues().length; x++) {
          User user = (User)this.jList1.getSelectedValues()[x];
          if (!user.getNick().equals(ConnectionAntPanel.nick)){
            try{
              this.bot.sendCTCPCommand(user.getNick(),
                                   "ANtsCommandCode:0001 " +
                                   FrameAnt.getInstance(null).ga.cap.getLocalStringAddress() +
                                   ":" +
                                   this.bot.getCaller().warriorAnt.getServerPort());
            }catch(Exception ex){_logger.error("",ex);}
          }
        }
      }
    }
  }

  void jButton2_actionPerformed(ActionEvent e) {
    if ( ( (String)this.getCurrentSelectedDiscussion()).charAt(0) == '#') {
      if (this.jList1.getSelectedValues().length > 0) {
        for (int x = 0; x < this.jList1.getSelectedValues().length; x++) {
          User user = (User)this.jList1.getSelectedValues()[x];
          if (!user.getNick().equals(ConnectionAntPanel.nick)) {
            try {
              this.bot.sendCTCPCommand(user.getNick(),
                                   "ANtsCommandCode:0002 " +
                                   this.jTextField3.getText() + " " +
                                   (String)this.getCurrentSelectedDiscussion());
            }
            catch (Exception ex) {
              _logger.error("",ex);
            }
          }
        }
      }
    }
  }

  void jTextPane1_mousePressed(MouseEvent e) {
    if (e.getClickCount() == 2 &&
          (e.getButton() == MouseEvent.BUTTON3 ||
           (e.getButton() == MouseEvent.BUTTON1 && e.isControlDown()))) {
      if (this.keepCurrentViewport == false) {
        this.vp = this.jScrollPane1.getViewport();
        this.keepCurrentViewport = true;
      }
      else {
        this.vp = null;
        this.keepCurrentViewport = false;
      }
    }
  }

  void jTextField4_focusLost(FocusEvent e) {
    //this.bot.setTopic(this.bot.getActiveChannel(),this.jTextField4.getText());
  }

  void jTextField4_keyPressed(KeyEvent e) {
    if(e.getKeyChar()=='\n'){
      this.bot.setTopic(this.bot.getActiveChannel(),this.jTextField4.getText());
    }
  }

  public void updateUsersNumberInCurrentChannel(int number){
    this.jLabel1.setText(ji.JI.i("Users")+"["+number+"]");
  }

  public void refreshCurrentChannel(){
    //this.bot.getCaller().setIrcUsersNumberInChannel(this.bot.getUsers( (String)this.jList2.getSelectedValue()).length, (String)this.jList2.getSelectedValue());
    this.updateUsersNumberInCurrentChannel(this.bot.getUsers( (String)this.jList2.getSelectedValue()).length);
    Object[] selected = this.getUserList().getSelectedValues();
    this.bot.refreshUsers( (String)this.jList2.getSelectedValue());
    for (int x = 0; x < selected.length; x++) {
      this.getUserList().setSelectedValue(selected[x], true);
    }
    StyledDocument discussion = this.bot.getDiscussion( (String)this.jList2.
        getSelectedValue());
    if (discussion != null)
      this.jTextPane1.setDocument(discussion);
    this.pendingDiscussions.remove(this.jList2.getSelectedValue());
    this.setTopic(this.bot.getTopic( (String)this.jList2.getSelectedValue()));
    this.checkOp();
  }

  public void refreshBanList(){
    currentBanlist = new ArrayList();
    this.jList3.setListData(currentBanlist.toArray());
    this.jList3.revalidate();
    this.bot.setMode((String)this.jList2.getSelectedValue(),"+b");
  }

  public void addBanlistElement(String banned) {
    currentBanlist.add(banned);
    this.jList3.setListData(currentBanlist.toArray());
    this.jList3.revalidate();
  }

  void this_componentResized(ComponentEvent e) {
    int width = this.getWidth() - 40;
    int height = this.getHeight() - 100 - this.jPanel1.getHeight() - this.jTextField4.getHeight();
    this.remove(this.jTextField4);
    this.remove(this.jTextField1);
    this.remove(this.jScrollPane1);
    this.remove(this.jScrollPane2);
    this.remove(this.jScrollPane3);
    this.remove(this.jLabel1);
    this.remove(this.jLabel4);
    this.remove(this.jButton1);
    this.remove(this.jPanel1);
    this.jPanel1.remove(this.jScrollPane4);
    this.jPanel1.remove(this.jLabel2);
    this.add(jTextField4,   new XYConstraints(2*width/12, 0, 7*width/12, -1));
    this.add(jScrollPane3,    new XYConstraints(9*width/12, this.jTextField4.getHeight(), 3*width/12, height));
    this.add(jScrollPane2,      new XYConstraints(0, this.jTextField4.getHeight(), 2*width/12, height));
    this.add(jScrollPane1,           new XYConstraints(2*width/12, this.jTextField4.getHeight(), 7*width/12, height));
    this.add(jTextField1,   new XYConstraints(width/6, this.jTextField4.getHeight() + height, 7*width/12, -1));
    this.add(jLabel1,   new XYConstraints(0, 0, -1, -1));
    this.add(jLabel4,  new XYConstraints(9*width/12, 0, -1, -1));
    this.add(jButton1, new XYConstraints(9*width/12 + 5, height + 25, -1, -1));
    this.jPanel1.add(this.jLabel2, new XYConstraints(4*width/12, 0, -1, -1));
    this.jPanel1.add(this.jScrollPane4, new XYConstraints(4*width/12, 15, 7*width/12, 120));
    this.add(jPanel1,           new XYConstraints(0, height + 60, width, 140));
  }

  void jList2_mouseReleased(MouseEvent e) {
    if(this.jList2.getSelectedValue() == null)
      this.jList2.setSelectedIndex(0);
    this.refreshCurrentChannel();
    this.refreshBanList();
  }

  void jList1_mousePressed(MouseEvent e) {
    if (e.getClickCount() == 1 &&
          (e.getButton() == MouseEvent.BUTTON3 ||
           (e.getButton() == MouseEvent.BUTTON1 && e.isControlDown()))) {
      ChatPopupMenu popup = new ChatPopupMenu(this, (User)this.jList1.getSelectedValue());
      popup.show(e.getComponent(), e.getX(), e.getY());
    }
  }

  void jButton4_actionPerformed(ActionEvent e) {
    String unban = (String)this.jList3.getSelectedValue();
    this.bot.unBan(this.getCurrentSelectedDiscussion(), unban);
  }
}

class ChatAntPanel_jTextField1_keyAdapter extends java.awt.event.KeyAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_jTextField1_keyAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void keyPressed(KeyEvent e) {
    adaptee.jTextField1_keyPressed(e);
  }
}

class ChatAntPanel_jButton1_actionAdapter implements java.awt.event.ActionListener {
  ChatAntPanel adaptee;

  ChatAntPanel_jButton1_actionAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}

class ChatAntPanel_jButton2_actionAdapter implements java.awt.event.ActionListener {
  ChatAntPanel adaptee;

  ChatAntPanel_jButton2_actionAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton2_actionPerformed(e);
  }
}

class ChatAntPanel_jTextPane1_mouseAdapter extends java.awt.event.MouseAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_jTextPane1_mouseAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void mousePressed(MouseEvent e) {
    adaptee.jTextPane1_mousePressed(e);
  }
}

class ChatAntPanel_jTextField4_focusAdapter extends java.awt.event.FocusAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_jTextField4_focusAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void focusLost(FocusEvent e) {
    adaptee.jTextField4_focusLost(e);
  }
}

class ChatAntPanel_jTextField4_keyAdapter extends java.awt.event.KeyAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_jTextField4_keyAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void keyPressed(KeyEvent e) {
    adaptee.jTextField4_keyPressed(e);
  }
}

class ChatAntPanel_jList2_mouseAdapter extends java.awt.event.MouseAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_jList2_mouseAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void mouseReleased(MouseEvent e) {
    adaptee.jList2_mouseReleased(e);
  }
}

class MyUserCellRenderer extends JLabel implements ListCellRenderer {
     ChatAntPanel cap;

     public MyUserCellRenderer(ChatAntPanel cap) {
         this.cap = cap;
         setOpaque(true);
     }
     public Component getListCellRendererComponent(
         JList list,
         Object value,
         int index,
         boolean isSelected,
         boolean cellHasFocus)
     {
         setText(value.toString());
         boolean isPending;
         if(cap != null && cap.pendingDiscussions.contains(value.toString()))
           isPending = true;
         else
           isPending = false;
         if(!isPending){
           setBackground(isSelected ? Color.blue : Color.white);
           setForeground(isSelected ? Color.white : Color.black);
         }else{
           setBackground(Color.lightGray);
           setForeground(Color.black);
         }
         return this;
     }
 }

class ChatAntPanel_this_componentAdapter extends java.awt.event.ComponentAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_this_componentAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void componentResized(ComponentEvent e) {
    adaptee.this_componentResized(e);
  }
}

class ChatAntPanel_jList1_mouseAdapter extends java.awt.event.MouseAdapter {
  ChatAntPanel adaptee;

  ChatAntPanel_jList1_mouseAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void mousePressed(MouseEvent e) {
    adaptee.jList1_mousePressed(e);
  }
}

class ChatAntPanel_jButton4_actionAdapter implements java.awt.event.ActionListener {
  ChatAntPanel adaptee;

  ChatAntPanel_jButton4_actionAdapter(ChatAntPanel adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jButton4_actionPerformed(e);
  }
}
